/* 基本数据类型 */
let num: Number = 1;
num = undefined;

// 元组类型 限制长度 item有不同类型
let tr: [string, number] = ["1", 2];

// 数组
let arr: Array<string> = ["2", "2"];
let arr1: number[] = [1, 2];
//枚举类型 有点像map表，做映射使用
//普通枚举，默认从0开始
//字符串枚举
enum USER_ROLE {
  USER = "yes",
  ADMIN = "no",
}
let agree = USER_ROLE.ADMIN;

/* 联合类型 */
let name1: string | number;
name1 = "22";
// ! name1!.toFixed 表示name1非空 不为null和underfined
// ? 表示属性可选
name1.toString();
const add = (val?: any) => {
  let a = val.name;
};

/* 接口类型 */
interface Aum {
  name: string;
  age: number;
}
interface FN {
  (obj: string): string;
}
const fn: FN = (val) => {
  return val;
};
/* 泛型 */
//定义函数 类 接口时 不预先指定具体类型，而在使用的时候在指定类型的一种特性

function addNum<T>(length: number, val: T): T[] {
  let result: T[] = [];
  for (let i = 0; i++; i < length) {
    result[i] = val;
  }
  return result;
}

/* 内置类型 */
//Partial将传入属性的不可选类型转为可选
//Required将传入的属性中的可选变为必选


interface Person{
    name:string;
    age:number;
    gender?:'male'|'female';
  }
  /**
   * type Require<T> = { [P in keyof T]-?: T[P] };
   */
  let p:Required<Person> = {
    name:'zhufeng',
    age:10,
    //gender:'male'
  }